package hibernate;

import modelo.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import modelo.Curso;
import modelo.Docente;
import modelo.Materia;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import vista.BuscarDocente;

public class HibernateDaoDocente {
	private static HibernateDaoDocente instancia;
	private static SessionFactory sf;
	
	public static HibernateDaoDocente getInstancia(){
		if(instancia == null) {
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateDaoDocente();
		}
		return instancia;
	}
	
	public void grabarDocente(Docente d){
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(d);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}
	

	
/*	@SuppressWarnings("rawtypes")
	public void dispdeldocente(int dni)
	{
		Session session= sf.openSession();
		Iterator i = session.createQuery("Select dd.dia,dd.hora From Docente d join d.disponibilidades dd where d.dni=(:dni)").setParameter("dni", dni).iterate();
		sf.close();
		
		while (i.hasNext()){
			Object[] tupla = (Object[])i.next();
			String dia = (String) tupla[0];
			String turno = (String) tupla[1];
			System.out.println(dia+"    "+turno);	
		}
	}*/
	
	public int horasDisponible(Docente d)
	{
		Session session = sf.openSession();
		int i=(int) session.createQuery("select count(dd.Id_Fecha_Horario) from Docente d join d.disponibilidades dd").uniqueResult();
		session.close();
		return i;
	}
	
	public List<Docente> traerDocentesDeMateriaOrdenadosPorDisp(Materia m)
	{
		Session session = sf.openSession();
		int i = m.getId();
		List<Docente> d = new ArrayList<Docente>();
		
		@SuppressWarnings("rawtypes")
		Iterator it = session.createQuery("From Materia m join m.docentes where m.Id_Materia =(:id)").setParameter("id",i).iterate();
		session.close();
		
		while(it.hasNext())
		{
			Object[] tupla = (Object[])it.next();
			int DNI= (int) tupla[0];
			String nombre = (String) tupla[1];
			String apellido= (String) tupla[2];
			
			Docente doc = new Docente(DNI, nombre, apellido);
			d.add(doc);
		}
		
		//ME FALTA ORDENAR LA LISTA
		return d;
		
	}
	
	public void eliminarDocente(int dni)
	{
		Session session =  sf.openSession();
		session.beginTransaction();
		Docente d = buscarDocente(dni);
		session.delete(d);
		session.getTransaction().commit();
		session.close();
		
		
	}

	public Docente buscarDocente(int dni)
	{
		Session session =  sf.openSession();
		Docente d = (Docente) session.createQuery("from Docente d where d.dni = (:dni)").setParameter("dni", dni).uniqueResult();
		if(d != null)
		{
			return d;
		}
		return null;
	}
}
